import router, { publicRoute, privateRoute } from '@/router'
import { deepCopy } from '@/utils'

export default {
  namespaced: true,
  state() {
    return {
      routes: [...publicRoute]
    }
  },
  mutations: {
    addRoutes(state, routes) {
      state.routes.push(...routes)
    }
  },
  actions: {
    /**
     * 根据用户权限，筛选出符合条件的私有路由表
     * @param {*} context
     * @param {*} menus 用户权限list
     */
    filterRoutes(context, menus) {
      // 查找私有路由中name属性包含在menus中的所有私有路由
      let routes = privateRoute.filter(route => menus.includes(route.name))

      // 所有不匹配的路由全部进入404页面
      // 注意：该配置必须要在所有的路由指定之后 /:catchAll(.*)
      routes.push({
        path: '/:catchAll(.*)',
        redirect: '/404'
      })

      // 将相同父路径的子路由合并一起
      routes = mergeRoute(routes)
      // 将筛选出符合条件的私有路由，添加到vuex中
      context.commit('addRoutes', routes)
      return routes
    },
    // 重置路由表
    resetRoute (context) {
      const user = context.rootGetters.user
      if (user && user.permission && user.permission.menus) {
        // 在 vuex 中获取menus权限列表
        const menus = user.permission.menus
        // 遍历权限列表，获取menu每一项，由于设定中权限中的每一项都对应权限路由的name
        menus.forEach(menu => {
          // 调用router的removeRoute方法，通过路由name删除掉指定路由
          router.removeRoute(menu)
        })
        console.log('router.getRoutes()', router.getRoutes())
      }
    }

  }
}

/**
 * 父路由相同的子路由合并一起
 * @param {*} routes
 * @returns
 */
const mergeRoute = routes => {
  const map = {}
  for (const route of routes) {
    const item = map[route.path]
    if (!item) {
      map[route.path] = deepCopy(route)
      if (!Array.isArray(route.children)) {
        map[route.path].children = []
      }
    } else {
      item.children.push(...(route.children || []))
    }
  }
  return Object.values(map)
}
